package main

import "fmt"

type Reader interface {
	Read() string
}

type Write interface {
	Write(data string)
}

type ReaderWriter interface {
	Reader
	Write
}

type _myStruct struct{}

func (m _myStruct) Read() string {
	return "Reading data"
}

func (m _myStruct) Write(data string) {
	fmt.Println("Writing:", data)
}

type _vehicle interface {
	Drive()
}

type _electricVehicle interface {
	_vehicle
	Charge()
}

type _tesla struct{}

func (t _tesla) Drive() {
	fmt.Println("Driving Tesla")
}

func (t _tesla) Charge() {
	fmt.Println("Charging Tesla")
}

func _printValue(i interface{}) {
	fmt.Println(i)
}

//func main() {
//	// 实现关系
//	// 一个类型可以实现多个接口，而接口本身也可以被其他接口嵌套。这意味着如果一个结构体实现了某个接口，且该接口嵌入了另一个接口，那么这个结构体也会隐式地实现嵌入的接口。
//	var rw ReaderWriter = &_myStruct{}
//	rw.Write("test")
//	fmt.Println(rw.Read())
//
//	// 组合关系
//	// 接口可以通过嵌套其他接口来组合出更复杂的接口。这种组合允许创建更高层次的抽象，增强代码的灵活性和可重用性
//	var v = &_tesla{}
//	v.Drive()
//	v.Charge()
//
//	// 空接口 interface{} 可以接受任何类型，因此它可以用于支持所有类型的函数或数据结构。空接口没有定义任何方法，这使其非常灵活，但在使用时需要小心类型断言
//	_printValue(32)
//	_printValue("hello")
//	_printValue(2.8238942)
//}
